package reflect;

import java.io.File;
import java.lang.reflect.Method;

public class ReflectDemo9 {
    public static void main(String[] args) throws Exception {
//        File dir = new File(
//                ReflectDemo9.class.getResource(".").toURI()
//        );

        /*
            类加载路径
            可以理解为是当前类所在顶级包的上一层.如果从源码目录看相当于是java目录
            实际是所有字节码文件编译后的顶级包的上一层.target/classes这里
         */

        //自动执行collection包下的所有类的main方法
        //定位:target/classes/collection
        File dir = new File(
                ReflectDemo9.class.getClassLoader().getResource(
                        "./collection"
                ).toURI()
        );
        File[] subs = dir.listFiles(f->f.getName().endsWith(".class"));
        for(File file : subs) {
            String fileName = file.getName();
            String className = fileName.substring(0, fileName.indexOf("."));
//            Class cls = Class.forName("reflect." + className);
            Class cls = Class.forName("collection." + className);
            //获取main方法
            try {
                Method m = cls.getMethod("main", String[].class);
                System.out.println("执行" + className + "的main方法");
                //调用静态方法时,第一个参数(方法所属对象)传入null
                /*
                    main方法的参数是一个String数组,但是直接传入String数组时它会
                    和invoke第二个参数(变长参数定义)冲突,使得invoke不认为传入的
                    String数组是main的唯一实参.因此将其强转成Object,使得认定为一个
                    实参.
                 */
                m.invoke(null, (Object) new String[]{});
            }catch(NoSuchMethodException e){
            }

        }
    }
}
